make a decision D
when You solve a problem P
???
logic / contingency
space
time
energy
computational complexity
human resources
material resources
eco(log|nom)ical constraints
socio-political
psycho-cognitive
legal
moral
"Illustration on a black background depicting the concept of 'constraint programming'. A set of interconnected nodes, each labeled as a variable, with chains or links representing constraints. Some nodes glow to indicate they are satisfying their constraints, while others are dim to show they aren't."
eight queen problems
map coloring problem
#Adam has one hour time on Monday and Wednesday, three hours time on Thursday and fours hours time on each weekend day, Eve has two hours on Tuesday, three hours on Friday and four hours on each weekend day. Define pyschedule resources with correctly defined periods and horizons. #Monday: Adam x 1 #Tuesday: Eva x 2 #Wednesday: Adam x 1 #Thursday: Adam x 4 #Friday: Eva x 3 #Saturday: Both x 4 #Sunday : Both x 4 from pyschedule import Scenario, solvers, plotters, alt # Define the scenario S = Scenario('household_chores', horizon=15) # Two weeks # Define the resources, resource costs are not obligatory but it's more fun with them adam = S.Resource('Adam',periods=[0,3,4,5,6,7,11,12,13,14]) eve = S.Resource('Eve',periods=[1,2,8,9,10,11,12,13,14]) kitchen=S.Resource('kitchen') # Define the tasks and their durations task_costs = { "meal1": {"length":1,"delay_cost":1}, # 1 hour, schedule towards beginning of the week "meal2": {"length":1,"delay_cost":1}, "meal3": {"length":1,"delay_cost":-1}, "meal4": {"length":1,"delay_cost":-1}, # 1 hour, schedule towards end of the week "bake": {"length":2,"delay_cost":0}, # 2 hours (1 cake) "sleeping_room": {"length":2,"delay_cost":0}, # it seems there is a bug for tasks longer >1 #"CSR1": {"length":1,"delay_cost":0}, # one way how to address the bug is to split long tasks into sub-tasks coupled by tight preference constraints #"CSR2": {"length":1,"delay_cost":0}, # "bathroom": {"length":2,"delay_cost":0}, # 2 hours "living_room": {"length":3,"delay_cost":0}, # 3 hours "clean_kitchen": {"length":3,"delay_cost":0} # 3 hours } tasks={} # Define alternative resources for each task for task,costs in task_costs.items(): print(task,costs) tasks[task] = S.Task(task,length=costs['length'],delay_cost=costs["delay_cost"]) #create new task tasks[task] += adam | eve #assign resources to newly created task #additional task-resource attributions tasks["clean_kitchen"]+=kitchen tasks["meal1"]+=kitchen tasks["meal2"]+=kitchen tasks["meal3"]+=kitchen tasks["meal4"]+=kitchen tasks["bake"]+=kitchen #tight precedence constraints #S += tasks['CSR1'] <= tasks['CSR2'] #optional tasks #tasks['playground'] = S.Task('playground',length=2,schedule_cost=-1) #tasks['playground'] += alt(adam,eve) #additional constraints S += tasks['meal1'] < tasks['clean_kitchen'] S += tasks['meal2'] < tasks['clean_kitchen'] S += tasks['meal3'] < tasks['clean_kitchen'] S += tasks['meal4'] < tasks['clean_kitchen'] S += tasks['bake'] < tasks['clean_kitchen'] # Solve the scenario solvers.mip.solve(S,msg=1,kind='GUROBI') print(S) print(S.solution()) print(adam.periods) # Plot the schedule plotters.matplotlib.plot(S)
pyschedule example
https://github.com/python-constraint/python-constraint
https://github.com/timnon/pyschedule
Note: install the most recent fork, (e.g. pip3.10 install "pyschedule"@git+"https://github.com/ppoile/pyschedule/#subdirectory=src")
Focus: LP deals specifically with linear equations and inequalities. This means it works with problems where relationships are represented as straight lines (hence 'linear').
Objective: It always aims to find the maximum or minimum value of a linear equation, known as the objective function. For example, maximizing profit or minimizing cost.
Method: LP uses specific mathematical methods, like the Simplex algorithm, to find the best solution.
Constraints: All constraints in LP are linear (straight-line relationships). For instance, you can't spend more than a certain budget, or you need at least a certain amount of some ingredient.
Solutions: Solutions in LP are often numerical and can include fractions or decimals.
Focus: CP is more general and can handle a wide variety of constraints, not just linear ones. It can deal with logical conditions, like "either-or" situations, and can include non-linear relationships.
Objective: CP doesn't necessarily have an objective function to optimize. Instead, it focuses on finding solutions that satisfy all the given constraints.
Method: It uses different algorithms than LP, often based on search techniques, like backtracking or heuristics.
Constraints: Constraints in CP can be diverse - linear, non-linear, logical conditions, etc. For example, a constraint could be that a certain task must be done before another can start.
Solutions: Solutions in CP are often discrete (like whole numbers) and can involve deciding between different options or scenarios.